const svg = d3.select("body").append("svg");
function joinDeDatos(datos) {
svg.attr("width", 50 + datos.length * 100).attr("height", 500);
svg
.selectAll("rect")
.data(datos)
.join("rect")
.attr("width", 50)
.attr("fill", "magenta")
.attr("height", (d) => d)
.attr("x", (_, i) => 50 + i * 100);
}
const datos = [10, 20, 30, 40];
joinDeDatos(datos);
const width = 600;
const height = 400;
const margin = {
top: 70,
bottom: 70,
right: 30,
left: 30,
};
const svg = d3
.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
const contenedor = svg
.append("g")
.attr("transform", `translate(${margin.left} ${margin.top})`);
function joinDeDatos(datos) {
const maximaFrecuencia = d3.max(datos, (d) => d.frecuencia);
const escalaAltura = d3
.scaleLinear()
.domain([0, maximaFrecuencia])
.range([0, height - margin.top - margin.bottom]);
const escalaY = d3
.scaleLinear()
.domain([0, maximaFrecuencia])
.range([height - margin.top - margin.bottom, 0]);
const ejeY = d3.axisLeft(escalaY);
svg
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`)
.call(ejeY)
.selectAll("line")
.attr("x1", width - margin.right - margin.left)
.attr("stroke-dasharray", "5")
.attr("opacity", 0.5);
const escalaX = d3
.scaleBand()
.domain(datos.map((d) => d.categoria))
.rangeRound([0, width - margin.right - margin.left])
.padding(0.5);
const ejeX = d3.axisBottom(escalaX);
svg
.append("g")
.attr("transform", `translate(${margin.left}, ${height - margin.bottom})`)
.call(ejeX)
.selectAll("text")
.attr("font-size", 20);
contenedor
.selectAll("rect")
.data(datos)
.join("rect")
.attr("width", escalaX.bandwidth())
.attr("fill", "magenta")
.attr("height", (d) => escalaAltura(d.frecuencia))
.attr("x", (d) => escalaX(d.categoria))
.attr("y", (d) => escalaY(d.frecuencia));
}
d3.json("datos.json")
.then((datos) => {
console.log(datos);
joinDeDatos(datos);
})
.catch((error) => console.log(error));
const width = 600;
const height = 400;
const margin = {
top: 70,
bottom: 70,
right: 30,
left: 30,
};
const svg = d3
.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
const contenedor = svg
.append("g")
.attr("transform", `translate(${margin.left} ${margin.top})`);
function joinDeDatos(datos) {
const maximaFrecuencia = d3.max(datos, (d) => d.frecuencia);
const escalaAltura = d3
.scaleLinear()
.domain([0, maximaFrecuencia])
.range([0, height - margin.top - margin.bottom]);
const escalaY = d3
.scaleLinear()
.domain([0, maximaFrecuencia])
.range([height - margin.top - margin.bottom, 0]);
const ejeY = d3.axisLeft(escalaY);
svg
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`)
.call(ejeY)
.selectAll("line")
.attr("x1", width - margin.right - margin.left)
.attr("stroke-dasharray", "5")
.attr("opacity", 0.5);
const escalaX = d3
.scaleBand()
.domain(datos.map((d) => d.categoria))
.rangeRound([0, width - margin.right - margin.left])
.padding(0.5);
const ejeX = d3.axisBottom(escalaX);
svg
.append("g")
.attr("transform", `translate(${margin.left}, ${height - margin.bottom})`)
.call(ejeX)
.selectAll("text")
.attr("font-size", 20);
contenedor
.selectAll("rect")
.data(datos)
.join("rect")
.attr("width", escalaX.bandwidth())
.attr("fill", "magenta")
.attr("height", (d) => escalaAltura(d.frecuencia))
.attr("x", (d) => escalaX(d.categoria))
.attr("y", (d) => escalaY(d.frecuencia));
}
d3.json("datos.json")
.then((datos) => {
console.log(datos);
joinDeDatos(datos);
})
.catch((error) => console.log(error));
d3-fetch
d3.csv(archivo)
: Para leer archivo CSV.d3.json(archivo)
: Para leer archivo JSON.d3.tsv(archivo)
: Para leer archivo TSV.d3.dsv(delimitador, archivo)
: Para leer archivo separado por un delimitdor com煤n.隆Revisa la documentaci贸n!
d3-scale
d3.scaleLinear()
: Escalas continuas lineales.d3.scalePow()
: Escalas continuas de potencia.d3.scaleLog()
: Escalas continuas logar铆tmicas.d3.scaleTime()
: Escalas que reciben fechas.d3.scaleOrdinal()
: Escalas de dominio y rango discreto.d3.bandScale()
: Escalas de dominio y rango discreto, pero donde el rango tiene valores num茅ricos y continuos. Pensado para generar barras en un espacio continuo.d3.scalePoint()
: Escalas de dominio y rango discreto, pero donde el rango tiene valores num茅ricos y continuos. Pensado para generar puntos en un espacio continuo.隆Revisa la documentaci贸n!
d3-axis
d3.axisTop()
: Eje horizontal con leyenda sobre eje.d3.axisBottom()
: Eje horizontal con leyenda bajo eje.d3.axisRight()
: Eje vertical con leyenda a la izquierda de eje.d3.axisLeft()
: Eje vertical con leyenda a la derecha de eje.隆Revisa la documentaci贸n!
d3-time
y d3-time-format
d3.timeDay.count(inicio, fin)
: Cuenta cuantos d铆as han pasado entre dos fechas.d3.timeFormat(formato)
: Para transformar fechas en strings en cierto formato.d3.timeParse(formato)
: Para obtener fechas desde strings en cierto formato.d3-array
d3.extent(arreglo)
: Para obtener valor m铆nimo y m谩ximo de arreglo datos.d3.median(arreglo)
: Para mediana de arreglo de datos.d3.variance(arreglo)
: Para varianza de arreglo de datos.d3.group(arreglo)
: Agrupa datos de un arreglo seg煤n sus valores.隆Revisa la documentaci贸n!
Visualizaci贸n de frecuencia de lanzamientos de basketball en la NBA.
Propuesta por estudiante Juan Dlugoszewski.
(Fuente: Shot chart dramatically shows the change in the NBA game)
隆Hay personas que han publicado c贸digo para generar este tipo de visualizaciones! Aqu铆 algunas en uso
(Fuente: d3.basketball-shot-chart)
Viernes 11 de septiembre (20:00) termina plazo de Hito 1.
Viernes 11 de septiembre (20:00) termina plazo de Hito 1.
Sesi贸n de martes 15 de septiembre revisamos Utilidades en D3.js II.
Viernes 11 de septiembre (20:00) termina plazo de Hito 1.
Sesi贸n de martes 15 de septiembre revisamos Utilidades en D3.js II.
隆Sesi贸n de jueves 17 de septiembre es libre! Me conectar茅 de todas formas por si tienen preguntas :)